//package com.allwees.bs.c.common.auth.oauth;
//
//import com.allwees.bs.c.common.auth.RequestMatcherBuilder;
//import com.allwees.bs.c.common.auth.config.PermitAllSecurityConfig;
//import com.allwees.bs.core.modelbase.constant.ResultEnum;
//import com.allwees.bs.core.modelbase.vo.R;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections.CollectionUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices;
//import org.springframework.boot.context.properties.ConfigurationProperties;
//import org.springframework.boot.web.servlet.FilterRegistrationBean;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.http.HttpMethod;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.ResponseEntity;
//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
//import org.springframework.security.oauth2.client.OAuth2ClientContext;
//import org.springframework.security.oauth2.client.OAuth2RestTemplate;
//import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter;
//import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter;
//import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
//import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
//import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
//import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
//import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
//import org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler;
//import org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint;
//import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
//import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
//import org.springframework.security.web.util.matcher.RequestMatcher;
//import org.springframework.web.filter.CompositeFilter;
//
//import javax.annotation.Resource;
//import javax.servlet.Filter;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * url 定义 OAuth2资源服务器配置
// *
// * @author jy2016
// */
//@Slf4j
//@Configuration
//@EnableOAuth2Client
//@EnableResourceServer
//public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {
//
//	@Resource
//	private OAuth2ClientContext oauth2ClientContext;
//
//	@Autowired
//	private PermitAllSecurityConfig permitAllSecurityConfig;
//
//	private static final String RESOURCE_ID = "allwees_resource_id";
//
//	/**
//	 *
//	 */
//	public static List<RequestMatcher> PERMIT_ALL_MATCHERS = new ArrayList<>();
//
//	@Override
//	public void configure(ResourceServerSecurityConfigurer resources) {
//		resources.resourceId(RESOURCE_ID)
//				.stateless(false)
//				.authenticationEntryPoint(authenticationEntryPoint());
//	}
//
//	@Override
//	public void configure(HttpSecurity http) throws Exception {
//		buildPermitAllMatchers();
//		http
//			.apply(permitAllSecurityConfig).and()
//			.antMatcher("/**").authorizeRequests()
//			.requestMatchers(PERMIT_ALL_MATCHERS.toArray(new RequestMatcher[0])).permitAll()
//			.anyRequest().authenticated()
//			// 角色作用域访问权限
////			.antMatchers("/**").access("#oauth2.hasScope('write')")
////			.and()
////			.logout().logoutSuccessUrl("/").permitAll()
//			.and().exceptionHandling()
//			.authenticationEntryPoint(authenticationEntryPoint())
//			.accessDeniedHandler(new OAuth2AccessDeniedHandler())
////			.and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
//			.and()
//			.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class)
//			.sessionManagement().maximumSessions(4)
//		;
//	}
//
//	private void buildPermitAllMatchers() {
//		if(CollectionUtils.isNotEmpty(PERMIT_ALL_MATCHERS)) {
//			return;
//		}
//		PERMIT_ALL_MATCHERS = RequestMatcherBuilder.builder()
//				.antMatchers(
//					"/api/v1/share/**",
//					"/api/v1/user/token",
//					"/api/v1/security/**",
//					"/", "/*.html", "/*.js", "/*.css", "/lib/**", "/login**",
//					"/favicon.ico",
//					"/user",
//					"/api/v1/upload/**")
//				.antMatchers("/api/test/**")
//				.antMatchers(HttpMethod.GET, "/api/v1/payment/paypal/return")
//				.antMatchers(HttpMethod.GET, "/api/v1/payment/paypal/cancel")
//				.antMatchers(HttpMethod.GET, "/api/v1/payment/app/paypal/return")
//				.antMatchers(HttpMethod.GET, "/api/v1/payment/app/paypal/cancel")
//				.antMatchers(HttpMethod.GET, "/api/v1/user/forget-password")
//				.antMatchers(HttpMethod.GET, "/api/v1/user/facebook/login")
//				.antMatchers(HttpMethod.GET, "/api/v1/user/thirdPart/login")
//				.antMatchers(HttpMethod.PUT, "/api/v1/user/reset-password")
//				.antMatchers(HttpMethod.POST, "/api/v1/cart/calculate-items")
//				.antMatchers(HttpMethod.POST, "/api/v1/cart/add-or-reduce")
//				.antMatchers(HttpMethod.POST, "/api/v1/cart/delete")
//				.antMatchers("/api/v2/app/init")
//				.antMatchers("/api/home/mix")
//				.antMatchers("/api/v1/ads/**")
//				.antMatchers("/api/v1/app/info/collect")
//				.antMatchers("/api/v2/upload/**")
//				.antMatchers("/api/v1/product/**")
//				.antMatchers("/api/v1/marketing/flash")
//				.antMatchers("/api/v1/marketing/gifts")
//				.antMatchers("/api/v1/marketing/influs")
//				.antMatchers("/api/v1/marketing/below5")
//				.antMatchers("/api/v1/countries")
//				.antMatchers("/api/v1/tuans/**")
//				.antMatchers("/api/v1/orders/**")
//				.antMatchers("/internal/**")
//				.antMatchers("/api/v1/app/**")
//				.antMatchers("/api/v2/app/**")
//				.antMatchers("/api/v1/booster/**")
//				.antMatchers("/api/v1/feedback")
//				.antMatchers("/api/v1/adlink")
//				.antMatchers("/api/v1/store/**")
//				.antMatchers("/code/getMsg")
//				.antMatchers("/actuator/**")
//				.antMatchers("/api/jobs/reissue")
//				.antMatchers(HttpMethod.POST, "/api/v1/user/register")
//				.antMatchers(HttpMethod.GET, "/api/v1/users/email/exists")
//				.antMatchers(HttpMethod.POST, "/api/v1/user/visitorShippingAddress")
//				.antMatchers("/druid/**")
//				.antMatchers("/api/webhook/process")
//				.antMatchers("/api/v1/edm/**")
//			.build();
//	}
//
//	@Bean
//	public OAuth2AuthenticationEntryPoint authenticationEntryPoint() {
//		OAuth2AuthenticationEntryPoint authenticationEntryPoint = new OAuth2AuthenticationEntryPoint();
//		authenticationEntryPoint.setExceptionTranslator(webResponseExceptionTranslator());
//		return authenticationEntryPoint;
//	}
//
//	@Bean
//	public WebResponseExceptionTranslator<R> webResponseExceptionTranslator() {
//		return e -> {
//			Throwable throwable = e.getCause();
//			if(throwable instanceof InvalidTokenException) {
//				log.info("invalid token or token has been expired");
//				R rd = R.error(ResultEnum.INVALID_TOKEN.getLeft(),ResultEnum.INVALID_TOKEN.getRight());
//				return new ResponseEntity<>(rd, HttpStatus.OK);
//			} else {
//				log.error("Unauthorized Action", e);
//				R rd = R.error(ResultEnum.UNAUTHORIZED.getLeft(),ResultEnum.UNAUTHORIZED.getRight());
//				return new ResponseEntity<>(rd, HttpStatus.OK);
//			}
//		};
//	}
//
//
//	private Filter ssoFilter() {
//		CompositeFilter filter = new CompositeFilter();
//		List<Filter> filters = new ArrayList<>();
//		filters.add(ssoFilter(facebook(), "/login/facebook"));
//		filter.setFilters(filters);
//		return filter;
//	}
//
//	private Filter ssoFilter(ClientResources client, String path) {
//		OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path);
//		OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
//		filter.setRestTemplate(template);
//		UserInfoTokenServices tokenServices = new UserInfoTokenServices(
//				client.getResource().getUserInfoUri(), client.getClient().getClientId());
//		tokenServices.setRestTemplate(template);
//		filter.setTokenServices(tokenServices);
//		return filter;
//	}
//
//	@Bean
//	@ConfigurationProperties("facebook")
//	public ClientResources facebook() {
//		return new ClientResources();
//	}
//
//	/**
//	 * 处理调整url为null的问题
//	 *
//	 * @param filter
//	 * @return
//	 */
//	@Bean
//	public FilterRegistrationBean<OAuth2ClientContextFilter> oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
//		FilterRegistrationBean<OAuth2ClientContextFilter> registration = new FilterRegistrationBean<>();
//		registration.setFilter(filter);
//		registration.setOrder(-100);
//		return registration;
//	}
//}
